<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../Universal.css">
</head>
<body>
    
    <div id="cnblogs_post_body" class="blogpost-body">
        <h2>不同修饰符使用细节</h2>
    <h3>常用来修饰类、方法、变量的修饰符</h3>
    <ul>
    <li>public 权限修饰符，公共访问, 类,方法,成员变量</li>
    <li>protected 权限修饰符，受保护访问, 方法,成员变量</li>
    <li>默认什么也不写 也是一种权限修饰符，默认访问, 类,方法,成员变量</li>
    <li>private 权限修饰符，私有访问, 方法,成员变量</li>
    <li>static 静态修饰符 方法,成员变量</li>
    <li>final 最终修饰符 类,方法,成员变量,局部变量</li>
    <li>abstract 抽象修饰符 类 ,方法</li>
    </ul>
    <p>我们编写程序时，权限修饰符一般放于所有修饰符之前，不同的权限修饰符不能同时使用；</p>
    <ul>
    <li>同时，abstract与private不能同时使用；</li>
    <li>同时，abstract与static不能同时使用；</li>
    <li>同时，abstract与final不能同时使用。</li>
    </ul>
    <h3>修饰类能够使用的修饰符</h3>
    <p>修饰类只能使用public、默认的、final、abstract关键字，使用最多的是 public关键字</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Demo {} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo2{}
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo3{}
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Demo4{}</pre>
    </div>
    <h3>修饰成员变量能够使用的修饰符</h3>
    <ul>
    <li>public : 公共的</li>
    <li>protected : 受保护的</li>
    <li>: 默认的</li>
    <li>private ：私有的</li>
    <li>final : 最终的</li>
    <li>static : 静态的</li>
    </ul>
    <p>使用最多的是 private</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count = 100<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count2 = 100<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> count3 = 100<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count4 = 100; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count5 = 100<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count6 = 100;</pre>
    </div>
    <h3>修饰构造方法能够使用的修饰符</h3>
    <ul>
    <li>public : 公共的</li>
    <li>protected : 受保护的</li>
    <li>: 默认的</li>
    <li>private ：私有的</li>
    </ul>
    <p>使用最多的是 public</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> Demo(){} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span>
    <span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> Demo(){}
    Demo(){}
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> Demo(){}</pre>
    </div>
    <h3>修饰成员方法能够使用的修饰符</h3>
    <ul>
    <li>public : 公共的</li>
    <li>protected : 受保护的</li>
    <li>: 默认的</li>
    <li>private ：私有的</li>
    <li>final : 最终的</li>
    <li>static : 静态的</li>
    <li>abstract : 抽象的</li>
    </ul>
    <p>使用最多的是 public</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> method1(){}<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span>
    <span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method2(){}
    </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method3(){}
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method4(){}
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method5(){}
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> method6(){}<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span> method7();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最常用的方式</span></pre>
    </div>
    <h2>类作为方法参数与返回值</h2>
    <h3>类作为方法参数</h3>
    <p>在编写程序中，会经常碰到调用的方法要接收的是一个类类型的情况，那么这时，要向方法中传入该类的对象。如下代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show(){
            System.out.println(</span>"show方法执行了"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建Person对象</span>
            Person p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        method(p);
        }
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来接收一个Person对象，在方法中调用Person对象的show方法</span>
    
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(Person p){
            p.show();
        }
    }</span></pre>
    </div>
    <h3>类作为方法返回值</h3>
    <p>写程序调用方法时，我们以后会经常碰到返回一个类类型的返回值，那么这时，该方法要返回一个该类的对象。如下代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show(){
            System.out.println(</span>"show方法执行了"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法，获取返回的Person对象</span>
            Person p =<span style="color: rgba(0, 0, 0, 1)"> method();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用p对象中的show方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        p.show();
        }
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来获取一个Person对象，在方法中完成Person对象的创建</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Person method(){
            Person p </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> p;
        }
    }</span></pre>
    </div>
    <h2>抽象类作为方法参数与返回值</h2>
    <h3>抽象类作为方法参数</h3>
    <p>开发中，抽象类作为方法参数的情况也很多见。当遇到方法参数为抽象类类型时，要传入一个实现抽象类所有抽象方法的子类对象。如下代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">抽象类</span>
    <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> Student <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show() {
            System.out.println(</span>"重写了show方法"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过多态的方式，创建一个Person类型的变量，而这个对象实际是Student</span>
            Person p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        method(p);
        }
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来接收一个Person类型对象，在方法中调用Person对象的show方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> method(Person p){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">抽象类作为参数
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过p变量调用show方法,这时实际调用的是Student对象中的show方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        p.show();
        }
    }</span></pre>
    </div>
    <h3>抽象类作为方法返回值</h3>
    <p>抽象类作为方法返回值的情况，也是有的，这时需要返回一个实现抽象类所有抽象方法的子类对象。如下代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">抽象类</span>
    <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> Student <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> show() {
            System.out.println(</span>"重写了show方法"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法，获取返回的Person对象</span>
            Person p =<span style="color: rgba(0, 0, 0, 1)"> method();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过p变量调用show方法,这时实际调用的是Student对象中的show方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        p.show();
        }
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来获取一个Person对象，在方法中完成Person对象的创建</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Person method(){
            Person p </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> p;
        }
    }</span></pre>
    </div>
    <h2>接口作为方法参数与返回值</h2>
    <h3>接口作为方法参数</h3>
    <p>接口作为方法参数的情况是很常见的，经常会碰到。当遇到方法参数为接口类型时，那么该方法要传入一个接口实现类对象。如下代码演示。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接口</span>
    <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Smoke{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> smoking();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> Student <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Smoke{
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> smoking() {
            System.out.println(</span>"课下吸口烟，赛过活神仙"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">通过多态的方式，创建一个Smoke类型的变量，而这个对象实际是Student</span>
            Smoke s = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student();
    </span><span style="color: rgba(0, 128, 0, 1)">        //</span><span style="color: rgba(0, 128, 0, 1)">调用method方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        method(s);
        }
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来接收一个Smoke类型对象，在方法中调用Smoke对象的show方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> method(Smoke sm){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接口作为参数
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">通过sm变量调用smoking方法，这时实际调用的是Student对象中的smoking方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        sm.smoking();
        }
    }</span></pre>
    </div>
    <h3>接口作为方法返回值</h3>
    <p>接口作为方法返回值的情况，在后面的学习中会碰到。当遇到方法返回值是接口类型时，那么该方法需要返回一个接口实现类对象。如下代码演示。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接口</span>
    <span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Smoke{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> smoking();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> Student <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Smoke{
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> smoking() {
            System.out.println(</span>"课下吸口烟，赛过活神仙"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">测试类</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法，获取返回的会吸烟的对象</span>
            Smoke s =<span style="color: rgba(0, 0, 0, 1)"> method();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过s变量调用smoking方法,这时实际调用的是Student对象中的smoking方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        s.smoking();
        }
    
     </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个方法method，用来获取一个具备吸烟功能的对象，并在方法中完成吸烟者的创建</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Smoke method(){
            Smoke sm </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sm;
        }
    }</span></pre>
    </div>
    <p>归纳总结：</p>
    <ul>
    <li>类作为方法参数时，说明要向方法中传入该类的对象</li>
    <li>类作为方法返回值时，说明该方法要返回一个该类的对象。</li>
    <li>抽象类作为方法参数时，说明要传入一个实现抽象类所有抽象方法的子类对象。</li>
    <li>抽象类作为方法返回值时，说明需要返回一个实现抽象类所有抽象方法的子类对象。</li>
    <li>接口作为方法参数时，说明该方法要传入一个接口实现类对象。</li>
    <li>接口作为方法返回值时，说明该方法需要返回一个接口实现类对象。</li>
    </ul>
    <h1>常用API</h1>
    <p>Java 的API（API: Application(应用) Programming(程序) Interface(接口)）就是JDK中提供给我们使用的类，这些类将底层的代码实现封装了起来，我们不需要关心这些类是如何实现的，只需要学习这些类如何使用即可。</p>
    <p>在JDK安装目录下有个src.zip文件，这个文件解压缩后里面的内容是所有Java类的源文件。可以在其中查看相对应的类的源码。<br>我们在每次查看类中的方法时，都打开源代码进行查看，这种方式过于麻烦。其实，我们可以通过查帮助文档的方式，来了解Java提供的API如何使用。如下图操作：查找Object类</p>
    <p><img src="https://images2015.cnblogs.com/blog/612774/201707/612774-20170713154734478-498247969.png" alt=""></p>
    <p>&nbsp;</p>
    <p>通过帮助文档中类与方法的介绍，我们就能够使用这个类了。</p>
    <h2>Object类</h2>
    <p>Object类是Java语言中的根类，即所有类的父类。所有类在创建对象的时候，最终找的父类就是Object。</p>
    <h3>equals方法</h3>
    <p>equals方法，用于比较两个对象是否相同，它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是==比较运算符。<br>在开发中要比较两个对象是否相同，经常会根据对象中的属性值进行比较，也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。如下代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
    描述人这个类，并定义功能根据年龄判断是否是同龄人
    由于要根据指定类的属性进行比较，这时只要覆盖Object中的equals方法
    在方法体中根据类的属性值进行比较
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span> Person <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Object{
        </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age ;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">复写父类的equals方法，实现自己的比较方式</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> equals(Object obj) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断当前调用equals方法的对象和传递进来的对象是否是同一个</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span> ==<span style="color: rgba(0, 0, 0, 1)"> obj){
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断传递进来的对象是否是Person类型</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span>(!(obj <span style="color: rgba(0, 0, 255, 1)">instanceof</span><span style="color: rgba(0, 0, 0, 1)"> Person)){
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将obj向下转型为Perosn引用，访问其属性</span>
            Person p =<span style="color: rgba(0, 0, 0, 1)"> (Person)obj;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.age ==<span style="color: rgba(0, 0, 0, 1)"> p.age;
        }
    }</span></pre>
    </div>
    <p>注意：在复写Object中的equals方法时，一定要注意public boolean equals(Object obj)的参数是Object类型，在调用对象的属性时，一定要进行类型转换，在转换之前必须进行类型判断。</p>
    <h3>toString方法</h3>
    <p>toString方法返回该对象的字符串表示，其实该字符串内容就是对象的类型+@+内存地址值。<br>由于toString方法返回的结果是内存地址，而在开发中，经常需要按照对象的属性得到相应的字符串表现形式，因此也需要重写它。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span> Person <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Object{
        </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age ;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据Person类的属性重写toString方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String toString() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> "Person [age=" + age + "]"<span style="color: rgba(0, 0, 0, 1)">;
        }
    }</span></pre>
    </div>
    <h2>String类</h2>
    <p>查阅API中的String类的描述，发现String 类代表字符串。Java 程序中的所有字符串字面值（如 "abc" ）都作为此类的实例实现。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">演示字符串</span>
    String str = "AAA"<span style="color: rgba(0, 0, 0, 1)">;
    str </span>= "BBB";</pre>
    </div>
    <p>字符串是常量；它们的值在创建之后不能更改。也就是说一旦这个字符串确定了，那么就会在内存区域中就生成了这个字符串。字符串本身不能改变，但str变量中记录的地址值是可以改变的。</p>
    <p>字符串有大量的重载的构造方法。通过String类的构造方法可以完成字符串对象的创建，那么，通过使用双引号的方式创建对象与new的方式创建对象，有什么不同呢？</p>
    <div class="cnblogs_code">
    <pre>String s3 = "abc"<span style="color: rgba(0, 0, 0, 1)">;
    String s4 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> String("abc"<span style="color: rgba(0, 0, 0, 1)">);
    System.out.println(s3</span>==s4);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">false</span>
    System.out.println(s3.equals(s4));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">true,<br>////因为String重写了equals方法，建立了字符串自己的判断相同的依据（通过字符串对象中的字符来判断）</span></pre>
    </div>
    <p>&nbsp;s3和s4的创建方式有什么不同呢？</p>
    <p>s3创建，在内存中只有一个对象。这个对象在字符串常量池中<br>s4创建，在内存中有两个对象。一个new的对象在堆中，一个字符串本身对象，在字符串常量池中</p>
    <h3>String类构造方法</h3>
    <p>构造方法是用来完成String对象的创建，下图中给出了一部分构造方法需要在API中找到，并能够使用下列构造方法创建对象。</p>
    <p><img src="https://images2015.cnblogs.com/blog/612774/201707/612774-20170713155617181-876994502.png" alt=""></p>
    <div class="cnblogs_code">
    <pre>String s1 = <span style="color: rgba(0, 0, 255, 1)">new</span> String(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建String对象，字符串中没有内容</span>
    
    <span style="color: rgba(0, 0, 255, 1)">byte</span>[] bys = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[]{97,98,99,100<span style="color: rgba(0, 0, 0, 1)">};
    String s2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> String(bys); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建String对象，把数组元素作为字符串的内容</span>
    String s3 = <span style="color: rgba(0, 0, 255, 1)">new</span> String(bys, 1, 3); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建String对象，把一部分数组元素作为字符串的内容，参数offset为数组元素的起始索引位置，参数length为要几个元素</span>
    
    <span style="color: rgba(0, 0, 255, 1)">char</span>[] chs = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)">[]{’a’,’b’,’c’,’d’,’e’};
    String s4 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> String(chs); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建String对象，把数组元素作为字符串的内容</span>
    String s5 = <span style="color: rgba(0, 0, 255, 1)">new</span> String(chs, 0, 3);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建String对象，把一部分数组元素作为字符串的内容，参数offset为数组元素的起始索引位置，参数count为要几个元素</span>
    <span style="color: rgba(0, 0, 0, 1)">
    String s6 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> String(“abc”); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建String对象，字符串内容为abc</span></pre>
    </div>
    <h3>String类的方法查找</h3>
    <p>String类中有很多的常用的方法，我们在学习一个类的时候，不要盲目的把所有的方法尝试去使用一遍，这时我们应该根据这个对象的特点分析这个对象应该具备那些功能，这样大家应用起来更方便。<br>字符串是一个对象，那么它的方法必然是围绕操作这个对象的数据而定义的。我们想想字符串中有哪些功能呢？<br>1、字符串中有多少个字符?</p>
    <div class="cnblogs_code">
    <pre>String str = "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> len =<span style="color: rgba(0, 0, 0, 1)"> str.length();
    System.out.println(</span>"len="+len);</pre>
    </div>
    <p>2、获取部分字符串</p>
    <div class="cnblogs_code">
    <pre>String str = "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    String s1 </span>= str.substring(1); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回一个新字符串，内容为指定位置开始到字符串末尾的所有字符</span>
    String s2 = str.substring(2, 4);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回一个新字符串，内容为指定位置开始到指定位置结束所有字符</span>
    System.out.println("str="+<span style="color: rgba(0, 0, 0, 1)">str);
    System.out.println(</span>"s1="+<span style="color: rgba(0, 0, 0, 1)">s1);
    System.out.println(</span>"s2="+s2);</pre>
    </div>
    <p>3、字符串是否以指定字符串开头。结尾同理</p>
    <div class="cnblogs_code">
    <pre>String str = "StringDemo.java"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> b1 = str.startsWith("Demo");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否以给定字符串开头</span>
    <span style="color: rgba(0, 0, 255, 1)">boolean</span> b2 = str.startsWith("String"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> b3 = str.endsWith("java");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否以给定字符串结尾</span></pre>
    </div>
    <p>4、字符串中是否包含另一个字符串</p>
    <div class="cnblogs_code">
    <pre>String str = "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> index = str.indexOf(“bcd”); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否包含指定字符串，包含则返回第一次出现该字符串的索引，不包含则返回-1</span>
    <span style="color: rgba(0, 0, 255, 1)">boolean</span> b2 = str.contains("bcd");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否包含指定字符串，包含返回true，不包含返回false</span></pre>
    </div>
    <p>5、将字符串转成一个字符数组。或者字节数组</p>
    <div class="cnblogs_code">
    <pre>String str = "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">char</span>[] chs =<span style="color: rgba(0, 0, 0, 1)"> str.toCharArray();
    </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bytes = str.getBytes();</pre>
    </div>
    <p>6、判断两个字符串中的内容是否相同</p>
    <div class="cnblogs_code">
    <pre>String str = "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    String str2 </span>= "abcde"<span style="color: rgba(0, 0, 0, 1)">;
    String str3 </span>= "hello"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> b1 =<span style="color: rgba(0, 0, 0, 1)"> str.equals(str2);
    </span><span style="color: rgba(0, 0, 255, 1)">boolean</span> b2 = str.equals(str3);</pre>
    </div>
    <p>7、获取该字符串对象中的内容</p>
    <div class="cnblogs_code">
    <pre>String str = <span style="color: rgba(0, 0, 255, 1)">new</span> String("hello"<span style="color: rgba(0, 0, 0, 1)">);
    System.out.println( str.toString() );
    System.out.pintln( str );</span></pre>
    </div>
    <p>直接打印引用类型变量时，默认调用该类型进行重写后的toString方法</p>
    <p>下面的需求所对应的方法，自己动手在API中查找，并进行方法使用。</p>
    <ul>
    <li>判断该字符串的内容是否为空的字符串</li>
    <li>获取给定的字符，在该字符串中第一次出现的位置</li>
    <li>获取该字符串中指定位置上的字符</li>
    <li>把该字符串转换成 小写字符串</li>
    <li>把该字符串转换成 大写字符串</li>
    <li>在该字符串中，将给定的旧字符，用新字符替换</li>
    <li>在该字符串中， 将给定的旧字符串，用新字符串替换</li>
    <li>去除字符串两端空格，中间的不会去除，返回一个新字符串</li>
    </ul>
    <h2>StringBuffer类</h2>
    <p>在学习String类时，API中说字符串缓冲区支持可变的字符串，什么是字符串缓冲区呢？接下来我们来研究下字符串缓冲区。<br>查阅StringBuffer的API，StringBuffer又称为可变字符序列，它是一个类似于 String 的字符串缓冲区，通过某些方法调用可以改变该序列的长度和内容。<br>原来StringBuffer是个字符串的缓冲区，即就是它是一个容器，容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。</p>
    <h3>StringBuffer的方法使用</h3>
    <p>代码演示：<br>创建一个字符串缓冲区对象。用于存储数据。</p>
    <div class="cnblogs_code">
    <pre>StringBuffer sb = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuffer();
    sb.append(</span>"haha"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加字符串</span>
    sb.insert(2, "it");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在指定位置插入</span>
    sb.delete(1, 4);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除</span>
    sb.replace(1, 4, "cast");<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">替换指定范围内的内容</span>
    String str = sb.toString();</pre>
    </div>
    <p>注意：append、delete、insert、replace、reverse方法调用后，返回值都是当前对象自己，所以说，StringBuffer它可以改变字符序列的长度和内容。</p>
    <p>StringBuffer类方法查找练习<br>下面的需求所对应的方法，自己动手在API中查找，并进行方法使用。</p>
    <ul>
    <li>从指定位置开始，到末尾结束，截取该字符串缓冲区，返回新字符串</li>
    <li>在原有字符串缓冲区内容基础上，删除指定位置上的字符</li>
    
    
    </ul>
    <h3>对象的方法链式调用</h3>
    <p>在我们开发中，会遇到调用一个方法后，返回一个对象的情况。然后使用返回的对象继续调用方法。这种时候，我们就可以把代码现在一起，如append方法一样，代码如下：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个字符串缓冲区对象。用于存储数据。</span>
    StringBuffer sb = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuffer();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加数据。不断的添加数据后，要对缓冲区的最后的数据进行操作，必须转成字符串才可以。</span>
    String str = sb.append(<span style="color: rgba(0, 0, 255, 1)">true</span>).append("hehe").toString();</pre>
    </div>
    <p>无论多少数据，数据是什么类型都不重要，只要最终变成字符串就可以使用StringBuffer这个容器。</p>
    <h2>StringBuilder类</h2>
    <p>查阅API发现还有一个StringBuilder类，它也是字符串缓冲区，StringBuilder与它和StringBuffer的有什么不同呢？<br>我们阅读StringBuilder的API说明发现，它也是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API，<strong>但不保证同步</strong>。该类被设计用作 StringBuffer 的一个简易替换，用在字符串缓冲区被单个线程使用的时候（这种情况很普遍）。如果可能，建议优先采用该类，因为在大多数实现中，<strong>它比 StringBuffer 要快</strong>。</p>
    <h3>总结</h3>
    <p>1、Object: 它是所有类的超类，祖宗类。java中所有的类都直接或间接的继承这个类<br>方法：</p>
    <ul>
    <li>public String toString() 返回当前对象中的内容, 对于Object类默认操作来说，返回的对象的类型+@+内存地址值</li>
    <li>    public boolean equals(Object obj) 比较两个对象内容是否相同，对于Object类默认操作来说,比较的是地址值</li>
    
    
    </ul>
    <p>2、String: 字符串类，字符串是常量；它们的值在创建之后不能更改<br>方法：</p>
    <ul>
    <li>    boolean equals(Object obj) 判断两个字符串中的内容是否相同</li>
    <li>    boolean equalsIgnoreCase(String str)  判断两个字符串中的内容是否相同, 忽略大小写</li>
    <li>    boolean contains(String str) 判断该字符串中 是否包含给定的字符串</li>
    <li>    boolean startsWith(String str) 判断该字符串 是否以给定的字符串开头</li>
    <li>    boolean endsWith(String str) 判断该字符串 是否以给定的字符串结尾</li>
    <li>    boolean isEmpty() 判断该字符串的内容是否为空的字符串  ""</li>
    <li>    int length() 获取该字符串的长度</li>
    <li>    char charAt(int index) 获取该字符串中指定位置上的字符 </li>
    <li>        String substring(int start) 从指定位置开始，到末尾结束，截取该字符串，返回新字符串</li>
    <li>    String substring(int start,int end) 从指定位置开始，到指定位置结束，截取该字符串，返回新字符串 </li>
    <li>    int indexOf(int ch ) 获取给定的字符，在该字符串中第一次出现的位置</li>
    <li>    int indexOf(String str) 获取给定的字符串，在该字符串中第一次出现的位置</li>
    <li>    int indexOf(int ch,int fromIndex) 从指定位置开始，获取给定的字符，在该字符</li>
    <li>byte[] getBytes() 把该字符串 转换成 字节数组</li>
    <li>    char[] toCharArray() 把该字符串 转换成 字符数组</li>
    <li>String replace(char old,char new) 在该字符串中，将给定的旧字符，用新字符替换</li>
    <li>    String replace(String old,String new) 在该字符串中， 将给定的旧字符串，用新字符串替换</li>
    <li>    String trim() 去除字符串两端空格，中间的不会去除，返回一个新字符串</li>
    <li>    String toLowerCase() 把该字符串转换成 小写字符串 </li>
    <li>    String toUpperCase() 把该字符串转换成 大写字符串</li>
    <li>    int indexOf(String str,int fromIndex) 从指定位置开始，获取给定的字符串，在该字符串中第一次出现的位置</li>
    
    
    </ul>
    <p>3、StringBuffer/StringBuilder:<br>方法：</p>
    <ul>
    <li>public StringBuffer append(String str) 在原有字符串缓冲区内容基础上，在末尾追加新数据</li>
    <li>    public StringBuffer insert(int offset,String str) 在原有字符串缓冲区内容基础上，在指定位置插入新数据</li>
    <li>    public StringBuffer deleteCharAt(int index) 在原有字符串缓冲区内容基础上，删除指定位置上的字符</li>
    <li>    public StringBuffer delete(int start,int end) 在原有字符串缓冲区内容基础上，删除指定范围内的多个字符</li>
    <li>    public StringBuffer replace(int start,int end,String str)在原有字符串缓冲区内容基础上，将指定范围内的多个字符 用给定的字符串替换</li>
    <li>    public StringBuffer reverse() 将字符串缓冲区的内容 反转  "abc"----"cba"</li>
    <li>    public String substring(int start) 从指定位置开始，到末尾结束，截取该字符串缓冲区，返回新字符串</li>
    <li>    public String substring(int start,int end)  从指定位置开始，到指定位置结束，截取该字符串缓冲区，返回新字符串</li>
    
    
    </ul>
    </div>

</body>
</html>